package com.agv.core.dao.cxp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.springframework.jdbc.core.JdbcTemplate;

import com.agv.core.dao.IGridPojoDao;
import com.agv.core.dao.dataExtractor.CatalogosResultSetExtractor;
import com.agv.core.dao.dataExtractor.TypesAndDataRowMapper;
import com.agv.core.exception.AgvException;
import com.agv.core.util.Constantes;
import com.agv.core.util.GridPojo;
import com.agv.core.util.Util;
import com.agv.core.util.UtileriaBD;
public class FacturasNotasDebitoDaoImpl implements IGridPojoDao {

	private JdbcTemplate jdbcTemplate;
	private UtileriaBD utileriaBD;
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	// Metodos de la Tabla de Encabezado

	@SuppressWarnings("unchecked")
	@Override
	public GridPojo findFirstGrid(Object[] params) throws AgvException {
		try {
			Properties properties = Util
					.getProperties(Constantes.AGV_CXP_TRANSACCIONES);
			GridPojo pojo = new GridPojo();
			List<Map<String, Object>> datosTabla = new ArrayList<Map<String, Object>>();
			Map<String, String> datosCombo = new HashMap<String, String>();
			Map<String, Map<String, String>> combos = new HashMap<String, Map<String, String>>();

			// Properties del query de la tabla Encabezados

			datosTabla = (List<Map<String, Object>>) jdbcTemplate.query(properties.getProperty("agv.cxp.trn.listaFacturas"),params,
					new TypesAndDataRowMapper());
			pojo.setDatosTabla(datosTabla);
			pojo.setNombreTabla(properties.getProperty("agv.cxp.trn.nomTablaPrincipal"));
			pojo.setSecuencia(properties.getProperty("agv.cxp.trn.nomSecPrincipal"));
			
			// Combo del campo ID_TIPO_TRANSAC
			datosCombo = new HashMap<String, String>();
			String[] filas = properties.getProperty(
					"agv.cxp.trn.comboIdTipoTransac").split("\\|");
			for (int i = 0; i < filas.length; i++) {
				String[] clabeValor = filas[i].split(",");
				datosCombo.put(clabeValor[0], clabeValor[1]);
			}
			combos.put(properties.getProperty("agv.cxp.trn.comboIdTipoTransac.campo"), datosCombo);

			// Combo del campo ID_TRN_PROV

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboIdTrnProv"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboIdTrnProv.campo"), datosCombo);

			// Combo del campo ID_TRN_SUC_PROV

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboIdTrnSucProv"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboIdTrnSucProv.campo"), datosCombo);

			// Combo del campo TRN_TIPO_DCTO
			datosCombo = new HashMap<String, String>();
	        filas = properties.getProperty("agv.cxp.trn.comboTrnTipoDcto").split("\\|");
	        for (int i = 0; i < filas.length; i++) {
		        String[] clabeValor = filas[i].split(",");
		        datosCombo.put(clabeValor[0], clabeValor[1]);
	        }
	        combos.put(properties.getProperty("agv.cxp.trn.comboTrnTipoDcto.campo"), datosCombo);

			// Combo del campo ID_DIVISA

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboDivisa"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboDivisa.campo"), datosCombo);

			// Combo del campo TRN _TC

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboTrnTc"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboTrnTc.campo"), datosCombo);

			// Combo del campo FACTOR

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboFactor"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboFactor.campo"), datosCombo);

			// Combo del campo GEN_LINEAS_AUT

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboGenLinAuto"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboGenLinAuto.campo"), datosCombo);

				
			// Combo del campo CATEG_PROV

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboCategProv"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboCategProv.campo"), datosCombo);

			// Combo del campo TERM_PAGO

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboTermPago"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboTermPago.campo"), datosCombo);

			// Combo del campo TIPO_ANT
			
			 String[] columnas  = properties.getProperty("agv.cxp.trn.comboTipoAnt").split(",");
			   pojo.setBooleanos( Arrays.asList(columnas) );
			
			// Combo del campo PASIVO_CXP

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboPasivoCxp"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboPasivoCxp.campo"),datosCombo);

			pojo.setCatalogos(combos);
			return pojo;

		} catch (Exception e) {
			throw new AgvException(e);
		}
	}

	//********************** Fin de Metodos de la Tabla de Encabezado****************************

	// Inicio de Metodos de la Tabla Lines de Captura
	@SuppressWarnings("unchecked")
	@Override
	public GridPojo findSecondGrid(Object[] params) throws AgvException {
		try {
			Properties properties = Util.getProperties(Constantes.AGV_CXP_TRANSACCIONES);
			GridPojo pojo = new GridPojo();
			List<Map<String, Object>> datosTabla = new ArrayList<Map<String, Object>>();
			Map<String, String> datosCombo = new HashMap<String, String>();
			Map<String, Map<String, String>> combos = new HashMap<String, Map<String, String>>();

			// Query de la tabla Lineas de Facturas

			datosTabla = (List<Map<String, Object>>) jdbcTemplate.query(
					properties.getProperty("agv.cxp.trn.LineasFactura"),params,new TypesAndDataRowMapper());
			
			pojo.setDatosTabla(datosTabla);
			pojo.setNombreTablaSegundoGrid(properties.getProperty("agv.cxp.trn.nomTablaSecundaria"));
			pojo.setSecuencia(properties.getProperty("agv.cxp.trn.nomSecSecundaria"));
			
			// Combo del campo TIPO_LINEA
			datosCombo = new HashMap<String, String>();
			String [] filas = properties.getProperty("agv.cxp.trn.comboTipoLinea").split("\\|");
	        for (int i = 0; i < filas.length; i++) {
		        String[] clabeValor = filas[i].split(",");
		        datosCombo.put(clabeValor[0], clabeValor[1]);
	        }
			combos.put(properties.getProperty("agv.cxp.trn.comboTipoLinea.campo"), datosCombo);

			// Combo del campo COD_IMPUESTO

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboCodImpuesto"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboCodImpuesto.campo"), datosCombo);

			// Combo del campo CTA_CARGO

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboCtaCargo"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboCtaCargo.campo"), datosCombo);

			// Combo del campo COD_RET_IMP

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboCodRetImp"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboCodRetImp.campo"), datosCombo);

			// Combo del campo CATEG_ACTIVO

			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.cxp.trn.comboCategActivo"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.cxp.trn.comboCategActivo.campo"), datosCombo);

			pojo.setCatalogos(combos);
			return pojo;

		} catch (Exception e) {
			throw new AgvException(e);
		}
	}

	

	//************fin de Metodos de la Tabla GUARDAR DOCUMENTOS RELACIONADOS*********************


	public void setUtileriaBD(UtileriaBD utileriaBD) {
		this.utileriaBD = utileriaBD;
	}

}
